Open-Match 將 MMF 以獨立部件拆出,其中一個好處是,可以讓我們單獨對配對邏輯進行單元測試。測試這個環節在想要進入營運前,也是大家不可避免的一個環節,今天會簡單實驗一下,針對官方 demo 所提供的 MMF,進行測試與 benchmark。
由於官方提供的 MMF 是由 golang 撰寫的,今天將會以 golang 的測試工具進行測試,但如果各位打算以不同語言實作 MMF ,依然可以依照單元測試的原則,對你的 MMF 進行壓測哦~
包含兩個測試,ticketID 是否重複,以及兩人成對的邏輯是否正確
使用 golang 執行單元測試
~ go test -v
=== RUN TestMakeMatchesDeduplicate
--- PASS: TestMakeMatchesDeduplicate (0.00s)
=== RUN TestMakeMatches
--- PASS: TestMakeMatches (0.00s)
PASS
ok github.com/WeiWeiWesley/open-match/examples/functions/golang/soloduel/mmf 0.015s
同樣使用 mmf/soloduel,但加上筆者提供的 test code 執行效能測試。
test code
func BenchmarkMakeMatches(b *testing.B) {
for i := 0; i < b.N; i++ {
poolNameToTickets, ticketsCount := requestCreator()
equal := int(ticketsCount / 2) //期望總組數
matches, err := makeMatches(poolNameToTickets)
if err != nil {
b.Error(err)
}
if len(matches) != equal {
b.Errorf("should create total num of %d matches but got %d", equal, len(matches))
}
for _, match := range matches {
if len(match.Tickets) != 2 {
b.Error("match.Tickets count err")
}
if match.MatchFunction != matchName {
b.Error("matchName err")
}
}
}
}
//隨機產生請求
func requestCreator() (map[string][]*pb.Ticket, int) {
poolNum := rand.Intn(9) + 1 // random numbers of pools 1~10
poolNameToTickets := map[string][]*pb.Ticket{}
ticketCount := 1
for i := 0; i < poolNum; i++ {
aPoolTicketNum := rand.Intn(99) + 1 // random numbers of tickets 1~100
poolName := fmt.Sprintf("pool%d", i)
for j := 0; j < aPoolTicketNum; j++ {
poolNameToTickets[poolName] = append(poolNameToTickets[poolName], &pb.Ticket{
Id: fmt.Sprintf("%d", ticketCount),
})
}
}
return poolNameToTickets, ticketCount - 1
}
使用 golang 執行效能測試
結果可以看出,mmf/soloduel 可以在每秒執行 25,842次,平均單次執行時間為 47,391 ns
~ go test -v -bench=. -run=none .
goos: darwin
goarch: amd64
pkg: github.com/WeiWeiWesley/open-match/examples/functions/golang/soloduel/mmf
cpu: Intel(R) Core(TM) i5-7267U CPU @ 3.10GHz
BenchmarkMakeMatches
BenchmarkMakeMatches-4 25842 47391 ns/op
PASS
ok github.com/WeiWeiWesley/open-match/examples/functions/golang/soloduel/mmf 1.727s